<?php
/**
 * Created by PhpStorm.
 * User: yuanjie
 * Date: 15/12/4
 * Time: 下午4:47
 */
class OrderProductBaseItem extends Eloquent
{
    protected $table = "order_product_base_item";


    /**
     * @Author:      lyt
     * @DateTime:    2016-01-26 15:33:43
     * @Description: 用于修改基础产品的产品数量
     *  逻辑规则如下
     * 没有出库记录的  修改随意修改数量 null
     * 备货中 不能修改数量 需要领料 后在操作 0
     * 等待领料的  不能修改数量  需要领料 后在操作 1
     * 已经领料的  修改的数量  如果存在进行中的退库的不能修改数量  没有退库的 添加数量 的 生成新的 出库申请 如果 减少数量  退库成功 修改数量 2
     * 都是已经退货的 可以修改数量 3
     * 都是已经删除的 可以修改数量 4
     */
    public static function changeProductItemNum($order_id,$opbi_old,$number,$amount,$sc_user_id){
    	return DB::transaction(function () use ($order_id,$opbi_old,$number,$amount,$sc_user_id) {
    	    $opbi=OrderProductBaseItem::find($opbi_old->id);
            $temp_op_amount=$opbi->amount;
            $order=Orders::find($order_id);
            $temp_num=$number-$opbi->num;
            if($temp_num!=0){
                $moo=MaintenanceOutOrder::where("product_type","base")->where("product_item_id",$opbi->id)->whereIn("status",array(0,1))->first();
                if($moo){//如果存在 备货中或者 等待领料的 出库申请  不允许修改
                    return Lang::get("scs_error.order_product_item_change_error_40012");
                }
                $mro=MaintenanceReturnOrder::where("product_type","base")->where("product_item_id",$opbi->id)->where("status",0)->first();
                if($mro){//如果 存在 正在退库的 不允许修改
                    return Lang::get("scs_error.order_product_item_return_error_40013");
                }
            }            
            $temp_moo=MaintenanceOutOrder::where("product_type","base")->where("product_item_id",$opbi->id)->where("status",2)->first();            
            if($temp_moo){//如果存在已经领料的   该种情况 如果是数量增加 添加新的 出库申请  如果是减少  判断 领料 和退库数量 的差值 进行修改                
                if($temp_num>0){//如果是数量增加
                    if($temp_op_amount!=$amount){//非标耗材的时候价格因素起作用                                                                 
                        if($opbi->item_type==0&&PriceBargaining::ischange($opbi->item_id,$order->shop_id)==0){//如果标准耗材且 不能改价格的 该判断
                            return Lang::get("scs_error.order_price_error_400137");
                        }else{//如果是非标耗材或者是标准耗材能改价的走该判断
                            $max=MaintenanceStorageItem::where('item_id',$opbi->item_id)->where('shop_id',$order->shop_id)->where('type',1)->where('current_number','>',0)->where('status',1)->max('tax_purchase_price');      
                            if($amount < $max){
                                return Lang::get("scs_error.data_price_error_61018");
                            }
                        }
                        $opbi->amount=$amount;
                    }
                    $new_moo=new MaintenanceOutOrder;
                    $new_moo->shop_id=$order->shop_id;
                    $new_moo->status=0;
                    $new_moo->type=$opbi->item_type;
                    $new_moo->item_id=$opbi->item_id;
                    $new_moo->product_type="base";
                    $new_moo->product_item_id=$opbi->id;
                    $new_moo->order_id=$order->order_id;
                    $new_moo->number=$temp_num;
                    $new_moo->save();
                }else{///如果是数量减少 判断 出库数量 减去退库数量  如果 修改数量小于 出库数量减去退库数量 则 不允许修改  要退库在修改
                    if($temp_op_amount!=$amount){//非标耗材的时候价格因素起作用 
                        if($opbi->item_type==0&&PriceBargaining::ischange($opbi->item_id,$order->shop_id)==0){//如果标准耗材且 不能改价格的 该判断
                            return Lang::get("scs_error.order_price_error_400137");
                        }else{
                            $max=0;
                            $ids=MaintenanceOutOrder::where("product_type","base")->where("product_item_id",$opbi->id)->where("status",2)->select("id")->get();
                            foreach ($ids as $_ids) {
                                $temp_max=DB::select("select max(tax_purchase_price) as max from  maintenance_out_item where number>return_numer and order_out_id=?",array($_ids->id));
                                $max=$max<$temp_max[0]->max?$temp_max[0]->max:$max;
                            }
                            if($amount < $max){
                                return Lang::get("scs_error.data_price_error_61018");
                            }
                        }
                        $opbi->amount=$amount;
                    }
                    if($temp_num<0){
                        $cro_num=MaintenanceReturnOrder::where("product_type","base")->where("product_item_id",$opbi->id)->where("status",1)->sum("number");//退库数量
                        $coo_num=MaintenanceOutOrder::where("product_type","base")->where("product_item_id",$opbi->id)->where("status",2)->sum("number");//出库数量
                        if($coo_num-$cro_num>$number){// 出库数量 -退库数量 大于等 修改树龄
                            return Lang::get("scs_error.order_product_item_change_error_40014");
                        }
                    }                    
                }
            }else{//如果不存在已经领料的  就是 该耗材项  没申请过领料 或者 是 申请领料 都已退货 都已删除 该种情况随意修改耗材数量
                if($temp_op_amount!=$amount){//非标耗材的时候价格因素起作用                     
                    if($opbi->item_type==0&&PriceBargaining::ischange($opbi->item_id,$order->shop_id)==0){//如果标准耗材且 不能改价格的 该判断
                        return Lang::get("scs_error.order_price_error_400137");
                    }else{
                        $max=MaintenanceStorageItem::where('item_id',$opbi->item_id)->where('shop_id',$order->shop_id)->where('type',1)->where('current_number','>',0)->where('status',1)->max('tax_purchase_price');
                        if($amount < $max){
                            return Lang::get("scs_error.data_price_error_61018");
                        }
                    }
                    $opbi->amount=$amount;
                }
            }
            $opr=new OrderProductRecord();
            $opr->order_id=$order->order_id;
            $opr->product_type='base';
            $opr->operation_type='update';
            $opr->num=$opbi->num;
            $opr->operation_grade='二级';
            $opr->user_id=$sc_user_id;
            $opr->user_type='sc';
            $opr->operation_id=$opbi->id;
            $opr->name=$opbi->item_name;
            $opr->amount=$temp_op_amount;
            $opr->save();
            $opbi->num=$number;
            $opbi->save();
            
            //订单应付金额及优惠信息将重新计算，废弃原有再优惠信息上加减
            Orders::calculate($order_id);
            $op=OrderProduct::find($opbi->order_product_package_id);
            // if(OrderProduct::isUseCoupon($order_id,$op->id)){
            //     $coupon_discount=$op->coupon_discount;

            //     //重新计算优惠券
            //     $coupon_order=CouponOrderInfo::where('order_id',$order_id)->where('status',1)->where('val_status',1)->first();
            //     $coupon=Coupons::find($coupon_order->coupon_id);                
            //     $cbi=CouponBaseInfo::find($coupon->coupon_base_info_id);
            //     //如果条件满足 查看优惠券优惠的项目存在不存在
            //     // $op=OrderProduct::find($coupon_order->product_id);
            //     switch ($cbi->type) {                    
            //         case 2://服务抵用卷
            //             $temp_coupon_amount=$op->amount;                        
            //             break;                    
            //         case 4://服务减免券
            //             $temp_coupon_amount=$cbi->amount;                        
            //             break;
            //         case 5://服务折扣券                       
            //             $temp_coupon_amount=round($op->amount*(1-$cbi->discount));
            //             break;
            //     }

            //     $op->coupon_discount=$temp_coupon_amount;
            //     $op->save();
            //     $temp_amount=$temp_coupon_amount-$coupon_discount;
            //     $order->discount_amount+=$temp_amount;
            //     $order->save();
            //     Orders::calculate($order_id);
            // }
            Coupons::check_coupons($order_id);
            return array('code' => 0, 'msg' => 'ok', 'result' => array("order_id"=>$order_id));
        });
    }
    /**
     * @Author:      lyt
     * @DateTime:    2016-01-28 10:43:44
     * @Description: 用于修改基础产品的产品型号
     *  逻辑规则如下
     * 没有出库记录的  修改随意
     * 备货中 不能修改  或者出库退库 后在操作 0
     * 等待领料的  不能修改  需要领料全部退库 后在操作 1
     * 已经领料的  修改的数量  需要退库 在操作 2
     * 都是已经退货的 可以修改 3
     * 都是已经删除的 可以修改 4
     */
    public static function changeProductItem($order_id,$opbi,$si,$sc_user_id,$new_item_type){
        return DB::transaction(function () use ($order_id,$opbi,$si,$sc_user_id,$new_item_type) {
            $order=Orders::find($order_id);
            //判断出库条件
            $moo=MaintenanceOutOrder::where("product_type","base")->where("product_item_id",$opbi->id)->whereIn("status",array(0,1,2))->first();
            if($moo){//如果存在 备货中或者 等待领料的 出库申请 已经领料的 不允许修改
                return Lang::get("scs_error.order_product_item_change_error_40012");
            }
            if($new_item_type!=$opbi->item_type||$opbi->item_id!=$si->id){//说明更换了耗材 才进这些判断
                if($opbi->item_type==0&&$opbi->is_adapter==1){//说明原来 是标准耗材 并且 是耗材更换不是 不适配更换
                    OrderSmyFilling::where("order_id",$order->order_id)->where("product_item_id",$opbi->id)->where("product_type","base")->update(array("status"=>0));//取消原来的的耗材的添注记录
                }
                //判断特殊油品            
                if($new_item_type==0){
                    if(in_array($si->id,Config::get("smy.item_id"))){//如果新耗材是特殊油品
                        OrderSmyFilling::saveosf($order->shop_id,$si->id,"base",$opbi->id,$order->order_id);
                    }
                } 
            }
                       

            $opr=new OrderProductRecord();
            $opr->order_id=$order->order_id;
            $opr->product_type='base';
            $opr->operation_type='update';
            $opr->num=$opbi->num;
            $opr->operation_grade='二级';
            $opr->user_id=$sc_user_id;
            $opr->user_type='sc';
            $opr->operation_id=$opbi->id;
            $opr->name=$opbi->item_name;
            $opr->amount=$opbi->amount;
            $opr->save();
            // if($new_item_type==0){
                $item_info=SupplyItem::getCacheItemInfo($si->id);
                Log::info($item_info);
                // $ss=SupplySeries::find($si->series_id);
                $opbi->item_name=$item_info->name;
                $opbi->amount=$si->amount;
                $opbi->item_id=$si->id;
                $opbi->unit=$item_info->unit?$item_info->unit:'';
            // }else{
            //     $opbi->item_name=$si->series_name." ".$si->model;
            //     $opbi->amount=$si->amount;
            //     $opbi->item_id=$si->id;
            //     $opbi->unit=$si->unit;
            // }
            $opbi->item_type=$new_item_type;
            $opbi->discount=1;
            $opbi->is_adapter=1;
            $opbi->save();

            //订单应付金额及优惠信息将重新计算，废弃原有再优惠信息上加减
            Orders::calculate($order_id);
            $op=OrderProduct::find($opbi->order_product_package_id);
            // if(OrderProduct::isUseCoupon($order_id,$op->id)){
            //     $coupon_discount=$op->coupon_discount;
            //     //重新计算优惠券
            //     $coupon_order=CouponOrderInfo::where('order_id',$order_id)->where('status',1)->where('val_status',1)->first();
            //     $coupon=Coupons::find($coupon_order->coupon_id);                
            //     $cbi=CouponBaseInfo::find($coupon->coupon_base_info_id);
            //     //如果条件满足 查看优惠券优惠的项目存在不存在
            //     // $op=OrderProduct::find($coupon_order->product_id);
            //     switch ($cbi->type) {                    
            //         case 2://服务抵用卷
            //             $temp_coupon_amount=$op->amount;                        
            //             break;                    
            //         case 4://服务减免券
            //             $temp_coupon_amount=$cbi->amount;                        
            //             break;
            //         case 5://服务折扣券                       
            //             $temp_coupon_amount=round($op->amount*(1-$cbi->discount));
            //             break;
            //     }

            //     $op->coupon_discount=$temp_coupon_amount;
            //     $op->save();
            //     $temp_amount=$temp_coupon_amount-$coupon_discount;
            //     $order->discount_amount+=$temp_amount;
            //     $order->save();
            //     Orders::calculate($order_id);
            // }
            Coupons::check_coupons($order_id);
            return array('code' => 0, 'msg' => 'ok', 'result' => array("order_id"=>$order_id));
        });
    }
}
